// src/utils/request.js
import axios from 'axios'
import { ElMessage } from 'element-plus' // 用于提示错误

// 创建 Axios 实例
const request = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL,
  timeout: 5000, // 请求超时时间
  headers: {
    'Content-Type': 'application/json', // 默认请求体格式为 JSON（与后端匹配）
  },
})

// 请求拦截器：可添加 Token 等公共参数（登录后用）
request.interceptors.request.use(
  (config) => {
    const token = localStorage.getItem('token');
    if (token) {
      config.headers.Authorization = `Bearer ${token}`;  // 关键：添加 Bearer token
    }
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

// 响应拦截器：统一处理后端返回的错误
request.interceptors.response.use(
  (response) => {
    // 直接返回响应体中的 data（后端返回的 JSON 数据）
    return response.data
  },
  async (error) => {
    // 处理 401 未授权错误（token 过期或无效）
    if (error.response?.status === 401) {
      const { useUserStore } = await import('@/store/index.js');
      const { useRouter } = await import('vue-router');

      const userStore = useUserStore();
      const router = useRouter();

      // 清除用户信息
      userStore.clearUserInfo();

      // 显示错误提示
      ElMessage.error('登录已过期，请重新登录');

      // 重定向到登录页
      router.push('/');

      return Promise.reject(error);
    }

    // 处理 403 禁止访问错误（权限不足）
    if (error.response?.status === 403) {
      ElMessage.error('您没有权限执行此操作');
      return Promise.reject(error);
    }

    // 处理 5xx 服务器错误
    if (error.response?.status >= 500) {
      const errorMsg = error.response?.data?.msg || '服务器异常，请稍后重试';
      ElMessage.error(errorMsg);
      return Promise.reject(error);
    }

    // 其他网络错误或超时
    if (!error.response) {
      ElMessage.error(error.message || '网络连接失败，请检查网络设置');
      return Promise.reject(error);
    }

    // 对于其他 HTTP 错误状态码，也显示后端返回的错误信息
    const errorMsg = error.response?.data?.msg || error.message || '请求失败，请稍后重试';
    ElMessage.error(errorMsg);
    return Promise.reject(error)
  },
)

export default request
